package NiMing_InnerClass;

//匿名内部类本质上就是隐藏了名字的内部类

public class Test {
    public static void main(String[] args) {
        /*
             匿名内部类格式：
               new 类名或者接口名() {
                   重写方法;
               };
       */

        //编写匿名内部类的代码
        new Swim() {   //因为Swim是一个接口，故匿名内部类与之是实现关系
            @Override
            public void swim() {
                System.out.println("重写了游泳的方法");
            }
        };  //注意：目前只是创建了一个对象，其内部的sout并不会执行


        new Animal() {  //因为Animal是一个类，故匿名内部类与之是继承关系
            @Override
            public void eat() {
                System.out.println("重写了Animal中的方法");
            }
        };  //同上，目前也只是创建了一个对象

        //在测试类中调用method方法
        //以前要自己写一个子类继承Animal类
        //再创建一个对象，传递给method方法
        Dog d = new Dog();
        method(d);
        //如果Dog类只用一次，还需要单独定义一个类太麻烦了
        method(
                new Animal() {
                    @Override
                    public void eat() {
                        System.out.println("狗吃骨头");
                    }
                }    //这里new Animal的整个部分相当于34行method(d)中的d(创建出的对象)
        );
    }

    public static void method(Animal a) { //Animal a = 子类对象  （多态）
        a.eat();//编译看左边，运行看右边
    }
}
